/**
 * 
 */
package com.fr.service;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.fr.dao.DetectionDAO;
import com.fr.dao.FaceDAO;
import com.fr.dao.PersonDAO;
import com.fr.dao.SearchingDAO;
import com.fr.model.Detection;
import com.fr.model.Face;
import com.fr.model.Person;
import com.fr.model.Searching;
import com.fr.util.DateUtil;
import com.fr.util.YoutuSign;
import com.fr.youtu.Youtu;

/**
 * @author 作者：Zhangyangyang
 * @version 创建时间：2017年1月4日 下午1:04:14 类说明：服务层功能接口实现类
 */
@Service
public class FaceServiceDAOImpl implements FaceServiceDAO {

	private static final String APP_ID = "1252828273";
	private static final String SECRET_ID = "AKIDUvAE6lSVZbUHtMeiaIoESTIxRp9KAXfb";
	private static final String SECRET_KEY = "PhtthIhuuiMqBxGRQCl7KL9k8KQhrHWZ";
	private static final String USER_ID = "0";
	private static final String BUCKET = "csjrobot";
	private static final int CODE = -2017;
	private static final String MESSAGE = "ERROR-DATABASE-OPERATION";

	@Autowired
	private PersonDAO personDAO;

	@Autowired
	private FaceDAO faceDAO;
	
	@Autowired
	private SearchingDAO searchingDAO;
	
	@Autowired
	private DetectionDAO detectionDAO;

	/**
	 * 先请求优图服务，解析返回码，添加成功后在进行数据库操作
	 */
	// 添加用户
	@Override
	public Map<String, Object> addPerson(Person person, String image) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();
		Youtu youtu = getYoutu();
		// 判断用户是否存在
		Person person2 = personDAO.findPersonByName(person.getName());
		if (true) {
			// 准备优图个体的数据
			String person_id = person.getPerson_id();
			List<String> group_ids = new ArrayList<>();
			group_ids.add(person.getGroup_id());

			try {
				json = youtu.NewPerson(image, person_id, group_ids, person.getName()); // 向优图添加个体
				if ("OK".equals(json.get("message").toString())) { // 判断返回数据message参数
					// 进行数据库操作
					JSONObject data = (JSONObject) (json.get("data")); // 将返回数据中的data字符串转换为json对象
					Face face = new Face(data.get("face_id").toString(), person.getPerson_id(), person.getGroup_id(),
							image);
					int n = personDAO.insert(person); // 向数据库中插入个体数据
					n += faceDAO.insert(face); // 向数据库中插入人脸数据
					if (n != 2) { // 后台数据库添加错误
						json.put("code", CODE);
						json.put("message", MESSAGE);
						deletePerson(person.getName()); // 优图服务端删除个体信息
					}
				}
			} catch (KeyManagementException e) {
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else {
			try {
				json.put("message", "PERSON-EXISTING");
				json.put("code", -1302);
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		map.put("json", json);
		return map;
	}

	// 删除用户
	@Override
	public Map<String, Object> deletePerson(String person_id) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();

		Person person = personDAO.findPersonByperId(person_id); // 判断用户是否存在
		if (person != null) { // 存在
			Youtu youtu = getYoutu();
			try {
				json = youtu.DelPerson(person_id); // 向优图中删除个体数据
				if ("OK".equals(json.get("message").toString())) { // 优图删除成功

					List<Face> list = faceDAO.findFaceByPerId(person.getPerson_id()); // 获得数据库中该用户的所有人脸
					int n = 0; // 定义标志
					for (Face face : list) {
						n += faceDAO.delete(face); // 循环删除数据库中该用户的人脸数据
					}
					int m = personDAO.delete(person); // 删除数据库中该用户的信息
					if (m != 1 || n != list.size()) { // 删除失败
						json.put("code", CODE);
						json.put("message", MESSAGE); // 那就失败吧……
					}

				}
			} catch (KeyManagementException e) {
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else {
			try {
				json.put("code", -1303);
				json.put("message", "PERSON-NOT-EXIST");
			} catch (JSONException e) {
				e.printStackTrace();
			}

		}
		map.put("json", json);
		return map;
	}

	// 根据用户标志查询用户
	@Override
	public Map<String, Object> findPersonByPersonId(String person_id) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();

		Person person = personDAO.findPersonByperId(person_id); // 从数据库中查询该用户信息
		if (person != null) { // 判断用户是否存在
			Youtu youtu = getYoutu();
			try {
				json = youtu.GetInfo(person_id); // 优图获取用户数据
			} catch (KeyManagementException e) {
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else {
			try {
				json.put("code", -1303);
				json.put("message", "PERSON-NOT-EXIST");
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		map.put("json", json);
		return map;
	}

	// 根据组标识查询一个组的所以用户信息
	// 优图端，已经不用
	@Override
	public List<Object> findPersonByGroupId(String group_id) {
		List<Object> list = new ArrayList<>();
		JSONObject json = new JSONObject(); // 定义一个json对象，用来接受优图返回的json数据
		JSONObject allJson = new JSONObject(); // 定义一个json对象，用来保存处理过的person数据
		JSONArray allArray = new JSONArray(); // 定义一个json数组，用来保存多个person对象
		JSONObject mostJson = new JSONObject(); // 定义一个json对象，用来保存json数组
		Youtu youtu = getYoutu();
		try {
			json = youtu.GetPersonIds(group_id); // 优图获取一个组内的所有用户数据
			if ("0".equals(json.get("code").toString())) { // 返回数据有效

				JSONObject jsonObject = new JSONObject(json.get("data").toString()); // 将返回数据中的data字符串转换为json对象

				String str = jsonObject.get("person_ids").toString(); // 获取person_ids字符串数组
				str = str.substring(1, str.length() - 1); // 截取person_ids字符串，去掉开始的"["
															// 和 结尾的"]"
				str = str.replace("\"", ""); // 去掉字符串中的引号
				String[] person_id = str.split(","); // 根据","好分割字符串，

				for (int i = 0; i < person_id.length; i++) { // 循环person_id字符串数组
					JSONObject jsonObject2 = new JSONObject();
					jsonObject2 = youtu.GetInfo(person_id[i]); // 根据person_id从优图获得person数据
					allJson = new JSONObject();
					JSONObject jsonObject3 = new JSONObject(jsonObject2.get("data").toString());
					allJson.put("person", jsonObject3); // 将person数据存入json对象中，并将json对象保存在json数组中
					allArray.put(allJson);
				}
				mostJson.put("data", allArray); // 添加json数组到json
			}

		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		list.add(mostJson);
		return list;
	}

	// 添加人脸
	@Override
	public Map<String, Object> addFace(String person_name, List<String> image) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();

		Person person = personDAO.findPersonByName(person_name); // 根据用户名称，从数据库查询用户数据
		if (person != null) { // 查询成功
			String person_id = person.getPerson_id(); // 获得用户的person_id
			Youtu youtu = getYoutu();
			try {
				json = youtu.AddFace(person_id, image); // 优图添加人脸数据
				if ("OK".equals(json.get("message").toString())) { // 优图添加成功，进行数据操作

					JSONObject data = (JSONObject) (json.get("data")); // 将返回数据中data字符串转换为json对象
					String face_ids = data.get("face_ids").toString(); // 从json中获得face_ids字符串
					face_ids = face_ids.substring(1, face_ids.length() - 1); // 以下是对face_ids字符串截取操作
					String[] face_id = face_ids.split(","); // 目的是获得face_id字符串数组
					if (face_id.length == image.size()) {
						for (int i = 0; i < face_id.length; i++) {
							face_id[i] = face_id[i].replace("\"", "");
							Face face = new Face(face_id[i], person_id, person.getGroup_id(), image.get(i));
							faceDAO.insert(face); // 数据库插入人脸
						}
					}
				}
			} catch (KeyManagementException e) {
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else {
			try {
				json.put("code", -1303);
				json.put("message", "PERSON-NOT-EXIST");
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		map.put("json", json);
		return map;
	}

	// 删除人脸
	@Override
	public Map<String, Object> deleteFace(String person_name, List<String> face_id) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();

		Person person = personDAO.findPersonByName(person_name); // 根据用户名称，从数据库获得用户数据
		if (person != null) { // 用户存在
			String person_id = person.getPerson_id();
			Youtu youtu = getYoutu();
			try {
				json = youtu.DelFace(person_id, face_id); // 优图删除人脸
				if ("OK".equals(json.get("message").toString())) { // 优图删除成功
					for (String string : face_id) {
						Face face = faceDAO.findFaceByFaceId(string); // 从数据库获得该人脸
						faceDAO.delete(face); // 数据库删除人脸
					}
				}
			} catch (KeyManagementException e) {
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else {
			try {
				json.put("code", -1303);
				json.put("message", "PERSON-NOT-EXIST");
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}

		map.put("json", json);
		return map;
	}

	// 查询一个人的所有人脸
	@Override
	public List<Object> findFaceAll(String person_name) {
		List<Object> list = new ArrayList<>();
		// 首先判断用户是否存在
		Person person = personDAO.findPersonByName(person_name);
		if (person != null) {

		}
		return list;
	}

	// 根据人脸标识查询人脸
	@Override
	public Map<String, Object> findFaceByFaceId(String face_id) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();
		Youtu youtu = getYoutu();
		try {
			json = youtu.GetFaceInfo(face_id);
			if ("OK".equals(json.get("message").toString())) {
			}
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		map.put("json", json);
		return map;
	}

	// 查询所有组列表
	@Override
	public Map<String, Object> findGroupAll() {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();
		Youtu youtu = getYoutu();
		try {
			json = youtu.GetGroupIds();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		map.put("message", json);
		return map;
	}

	// 人脸检索
	@Override
	public Map<String, Object> faceRecongition(String image, String group_id) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();
		JSONObject newJson = new JSONObject();
		JSONArray newArray = new JSONArray();
		JSONObject allJson = new JSONObject();
		Youtu youtu = getYoutu();
		try {
			json = youtu.FaceIdentify(image, group_id); // 优图人脸检索
			System.out.println(json);
			if ("0".equals(json.get("code").toString())) { // 搜索成功
				JSONObject jsonObject = new JSONObject(json.get("data").toString()); // 获得data字符串并转换为json对象
				JSONArray jsonArray = new JSONArray(jsonObject.get("candidates").toString()); // 获得候选人字符串并转换为json数组
				if (jsonArray.length() > 0) {
					for (int i = 0; i < jsonArray.length(); i++) { // 循环json数组
						JSONObject job = jsonArray.getJSONObject(i); // 遍历
																		// jsonarray
																		// 数组，把每一个对象转成
																		// json
																		// 对象
						/**
						 * 人脸检索记录添加
						 * 
						 */
						Searching searching = searchingDAO.findSearchByUserId(job.get("person_id").toString());
						if (searching == null) {
							searching = new Searching();
							searching.setProject("face_recognition");
							searching.setTimes(1);
							searching.setUpdate_time(DateUtil.getFormatTime());
							searching.setUser_id(job.get("person_id").toString());
							searchingDAO.insert(searching);
						}else {
							searching.setUpdate_time(DateUtil.getFormatTime());
							searching.setTimes(searching.getTimes()+1);
							searchingDAO.updateByPrimaryKey(searching);
						}
						
						Person person = personDAO.findPersonByperId(job.get("person_id").toString());
						System.out.println(job.get("person_id").toString());
						newJson = new JSONObject();
						newJson.put("confidence", Integer.valueOf(job.get("confidence").toString()));
						newJson.put("person_name", person.getName());
						newJson.put("person_id", person.getPerson_id());
						newArray.put(newJson); // 重新编写json数据，添加用户名称
					}

				}
			}
			allJson.put("candidates", newArray);
			map.put("json", allJson);

		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return map;
	}

	// 人脸检测
	@Override
	public Map<String, Object> faceDetect(String image, int mode) {
		Map<String, Object> map = new HashMap<>();
		JSONObject json = new JSONObject();
		Youtu youtu = getYoutu();
		try {
			json = youtu.DetectFace(image, mode); // 优图人脸检测
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		/**
		 * 人脸检测记录添加
		 */
		Detection detection = detectionDAO.findDetectionByProject("face_recognition");
		if (detection != null) {
			detection.setTimes(detection.getTimes() + 1);
			detection.setUpdate_time(DateUtil.getFormatTime());
			detectionDAO.updateByPrimaryKey(detection);
		}else {
			detection = new Detection();
			detection.setProject("face_recognition");
			detection.setTimes(1);
			detection.setUpdate_time(DateUtil.getFormatTime());
			detectionDAO.insert(detection);
		}
		
		map.put("json", json);
		return map;
	}

	// 获得签名
	@Override
	public String getSign() {
		StringBuffer mySign = new StringBuffer("");
		YoutuSign.appSign(APP_ID, BUCKET, SECRET_ID, SECRET_KEY, System.currentTimeMillis() / 1000 + 2592000, "0",
				mySign);
		return mySign.toString();
	}

	public Youtu getYoutu() {
		Youtu youtu = new Youtu(APP_ID, BUCKET, SECRET_ID, SECRET_KEY, Youtu.API_YOUTU_END_POINT, USER_ID);
		return youtu;
	}

	// 修改用户名称
	@Override
	public Map<String, Object> updatePerson(String person_name, String new_name) {
		Map<String, Object> map = new HashMap<>();
		Person person = personDAO.findPersonByName(person_name);
		JSONObject json = new JSONObject();
		if (person != null) {
			Youtu youtu = getYoutu();
			try {
				json = youtu.SetInfo(new_name, person.getPerson_id());
				if ("0".equals(json.get("code").toString())) { // 修改成功
					person.setName(new_name);
					personDAO.updateByPrimaryKey(person);
				}
			} catch (KeyManagementException e) {
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else {
			try {
				json.put("code", -1303);
				json.put("message", "PERSON-NOT-EXIST");
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		map.put("json", json);
		return map;
	}

	@Override
	public Map<String, Object> findPersonsByGroupId(String group_id) {
		Map<String, Object> map = new HashMap<>();
		List<Person> list = personDAO.findPersonByGroupId(group_id);
		JSONObject alldata = new JSONObject();
		JSONArray data = new JSONArray();
		for (Person person : list) {
			try {
				JSONObject per = new JSONObject();
				per.put("person_id", person.getPerson_id().toString());
				per.put("person_name", person.getName().toString());
				data.put(per);
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		try {
			alldata.put("data", data);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		map.put("json", alldata);
		return map;
	}

	@Override
	public JSONObject faceDectIdenfiy(String image, String group_id, int mode) {
		JSONObject data = new JSONObject();
		JSONObject dect = new JSONObject();
		JSONObject idenfiy = new JSONObject();
		
		return null;
	}
	
}
